package com.newlink.building.login.ui.fragments

import android.os.Bundle
import android.view.View
import com.newlink.building.login.R
import com.newlink.building.login.databinding.LayoutVerifyCodeBinding
import com.newlink.building.login.event.VerifyCodeEvent
import com.newlink.building.login.mvp.contract.Module_Login_InputVerifyCodeContract
import com.newlink.building.common_base.base.BaseMvpFragment
import com.newlink.building.common_base.ext.showToast
import com.newlink.building.common_base.utils.DialogUtil
import com.newlink.building.common_base.utils.logDebug
import com.newlink.building.login.mvp.presenter.Module_Login_InputVerifyCodePresenter
import org.greenrobot.eventbus.EventBus

/**
 * @Author: admin
 * @Date: 2022/9/13
 * @Description: 验证码确认页面，用于用户输入收到的验证码并进行验证。
 * @License:  Copyright  1998 Fanvil Technology Co., Ltd. All rights reserved.
 */
class Module_Login_VerifyCodeFragment :
    BaseMvpFragment<Module_Login_InputVerifyCodeContract.View, Module_Login_InputVerifyCodeContract.Presenter>(),
    Module_Login_InputVerifyCodeContract.View {

    // 视图绑定实例
    private lateinit var binding: LayoutVerifyCodeBinding

    // 需要验证的邮箱地址
    private var targetEmail: String = ""

    // 加载对话框
    private val loadingDialog by lazy {
        DialogUtil.getWaitDialog(requireContext())
    }

    /**
     * Companion object 用于提供Fragment实例。
     */
    companion object {
        // Bundle中用于传递邮箱地址的键
        private const val ARG_EMAIL: String = "VERIFY_EMAIL"

        /**
         * 获取VerifyCodeFragment的新实例。
         * @param email 需要验证的邮箱地址。
         * @return VerifyCodeFragment实例。
         */
        fun getInstance(email: String): Module_Login_VerifyCodeFragment {
            val fragment = Module_Login_VerifyCodeFragment()
            val bundle = Bundle().apply {
                putString(ARG_EMAIL, email)
            }
            fragment.arguments = bundle
            return fragment
        }
    }

    /**
     * 获取传递给Fragment的邮箱参数。
     * 这是一个辅助方法，方便在ForgetPwdEmailActivity中判断是否需要重新创建Fragment。
     */
    fun getArgumentParam(): String {
        return arguments?.getString(ARG_EMAIL, "") ?: ""
    }

    /**
     * 绑定布局文件并返回根视图。
     */
    override fun attachLayoutRes(): View {
        binding = LayoutVerifyCodeBinding.inflate(layoutInflater)
        return binding.root
    }

    /**
     * 创建Presenter实例。
     */
    override fun createPresenter(): Module_Login_InputVerifyCodeContract.Presenter = Module_Login_InputVerifyCodePresenter()

    /**
     * 初始化视图组件和设置验证码输入监听器。
     */
    override fun initView(view: View) {
        // 从arguments中获取邮箱地址，如果不存在则默认为空字符串
        targetEmail = requireArguments().getString(ARG_EMAIL, "")

        // 更新提示文本，显示目标邮箱
        val formattedContent = resources.getString(R.string.verify_code_content, targetEmail)
        binding.verifyContent.text = formattedContent

        // 设置验证码输入框的监听器
        binding.verifyView.listener = { inputCode, isComplete ->
            logDebug<Module_Login_VerifySMSCodeFragment>("输入验证码: $inputCode --- $isComplete")
            // 当验证码输入满4位时，显示加载对话框并发送验证请求
            if (inputCode.length == 4) {
                loadingDialog.show()
                mPresenter?.sendVerifyCode(inputCode, targetEmail)
            }
        }
    }

    /**
     * 懒加载方法，当前未实现具体逻辑。
     */
    override fun lazyLoad() {
        // 当前无需额外的懒加载逻辑
    }

    /**
     * 发送验证码成功回调。
     * 隐藏加载对话框，并通过EventBus发送验证码成功事件。
     */
    override fun sendVCSuccess() {
        loadingDialog.dismiss()
        EventBus.getDefault().post(VerifyCodeEvent(targetEmail))
    }

    /**
     * 发送验证码失败回调。
     * 隐藏加载对话框，并显示失败提示。
     */
    override fun sendVCFailed() {
        loadingDialog.dismiss()
        showToast(getString(R.string.verify_code_failed))
    }
}